package com.innotek.testworkstation.util;

import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;

/**
 * @ClassName PropertyUtil
 * @Description 文件配置获取类
 * @Author wangx
 * @Date 2020/3/20 14:45
 * @Version 1.0
 **/

@Slf4j
public class PropertyUtil {
    private static Properties props;

    /**
     * 加载配置文件
     * @param propertiesName 配置文件的名字
     */
    synchronized static private void loadProps(String propertiesName) {
        props = new Properties();
        InputStream in = null;
        try {
            //in = PropertyUtil.class.getClassLoader().getResourceAsStream(propertiesName);
            in = PropertyUtil.class.getResourceAsStream(propertiesName);
            assert in != null;
            props.load(new InputStreamReader(in, StandardCharsets.UTF_8));
        } catch (FileNotFoundException e) {
            log.error(propertiesName + "文件未找到");
        } catch (IOException e) {
            log.error("出现IOException");
        } finally {
            try {
                if (null != in) {
                    in.close();
                }
            } catch (IOException e) {
                log.error(propertiesName + "文件流关闭出现异常");
            }
        }
    }

    synchronized static private void writeProperties(String propertiesName, HashMap<String, Object> allMaps) {
        log.info("开始写入properties文件内容.......");
        props = new Properties();
        OutputStream output = null;
        try {
            output = new FileOutputStream(String.valueOf(Objects.requireNonNull(PropertyUtil.class.getResource(propertiesName)).getPath()), true);
            for (Map.Entry<String, Object> entry : allMaps.entrySet()) {
                props.setProperty(entry.getKey(), String.valueOf(entry.getValue()));
            }
            // 真正写入
            props.store(new OutputStreamWriter(output, StandardCharsets.UTF_8), "");
            // 保存键值对到文件中
        } catch (IOException io) {
            log.error(io.getMessage());
        } finally {
            if (output != null) {
                try {
                    output.close();
                    log.info("properties写入完成......");
                } catch (IOException e) {
                    log.error(e.getMessage());
                }
            }
        }
    }

    /**
     * 从配置文件里获取数据
     * @param propertiesName 配置文件名称
     * @param key key
     * @return 返回value，如果找不到，则返回null
     */
    public static String getProperty(String propertiesName, String key) {
        //logger.info("props:{}",props);
        loadProps(propertiesName);
        return props.getProperty(key);
    }

    /**
     * 从配置文件里获取所有数据
     * @param propertiesName 配置文件名称
     * @return 返回所有map
     */
    public static HashMap<String,Object> getAllProperty(String propertiesName) {
        //logger.info("props:{}",props);
        loadProps(propertiesName);
        HashMap<String, Object> map = new HashMap<>();
        Enumeration en = props.propertyNames();
        String key;
        String value;
        while(en.hasMoreElements()){
            key = (String) en.nextElement();
            value = props.getProperty(key);
            map.put(key, value);
        }
        return map;
    }

    /**
     * 配置文件里保存一个键值对
     * @param propertiesName 配置文件名称
     * @param key key
     * @param value 值
     */
    public static void setProperty(String propertiesName, String key, String value) {
        HashMap<String, Object> p = new HashMap<>();
        p.put(key, value);
        writeProperties(propertiesName, p);
    }

    /**
     * 配置文件里保存一个MAP
     * @param propertiesName 配置文件名称
     * @param p MAP
     */
    public static void setProperty(String propertiesName, HashMap<String, Object> p) {
        writeProperties(propertiesName,p);
    }



    /**
     * 删除配置文件里某个key
     * @param propertiesName 配置文件名字
     * @param key key
     */
    synchronized static public void removeProperty(String propertiesName,String key) {
        loadProps(propertiesName);

        OutputStream output = null;
        try {
            output = new FileOutputStream(String.valueOf(Objects.requireNonNull(PropertyUtil.class.getResource(propertiesName)).getPath()), false);
            if (props.containsKey(key)) {
                props.remove(key);
                // 保存到文件中(将properties保存到文件)
                props.store(new OutputStreamWriter(output, StandardCharsets.UTF_8), "");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (output != null) {
                try {
                    output.close();
                } catch (IOException e) {
                    log.error(e.getMessage());
                }
            }
        }

    }

    /**
     * 清空配置文件
     * @param propertiesName 配置文件名字
     */
    synchronized static public void cleanProperty(String propertiesName) {
        loadProps(propertiesName);

        OutputStream output = null;
        try {
            output = new FileOutputStream(String.valueOf(Objects.requireNonNull(PropertyUtil.class.getResource(propertiesName)).getPath()), false);
            log.info("------开始清理配置文件-----");
            log.info(String.format("%s 现有数据：%s",propertiesName, props.toString()));
            props.clear();
            // 保存到文件中(将properties保存到文件)
            props.store(new OutputStreamWriter(output, StandardCharsets.UTF_8), "");
            log.info("------配置文件清理完成-----");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (output != null) {
                try {
                    output.close();
                } catch (IOException e) {
                    log.error(e.getMessage());
                }
            }
        }

    }
}
